package com.liziing.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.google.gson.Gson;
import com.liziing.mapper.UsersMapper;
import com.liziing.pojo.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;

@RestController
@SuppressWarnings("all")  //取消所有预警
@RequestMapping("/user")
@CrossOrigin(origins = {"*", "null"})  //解决跨域
public class UserController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private UsersMapper userMapper;

    private Gson gson = new Gson();

    /**
     * 登录接口
     * @param users  用户的信息  比如账号  密码
     * @return
     */
    @PostMapping("/login")
    public String login(@RequestBody Users users) {
        //获取mybatisPlus 框架中的 LambdaQueryWrapper 类
        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        //构建查询语句 去数据库查询是否有这个  学号和密码的用户
        queryWrapper.eq(Users::getStudentNumber, users.getStudentNumber());
        queryWrapper.eq(Users::getPassword, users.getPassword());

        // 然后使用mybatisplus自带的selectOne方法 传入我们的查询条件  查出用户
        Users user = userMapper.selectOne(queryWrapper);
        //这是一个Token，用来标记用户是否已经登录
        String token = UUID.randomUUID().toString();
        //如果用户没找到，那么返回前端一个标识
        if (user == null) {
            return "0";
        } else {  // 如果找到用户，说明存在
            //存储到redis
            stringRedisTemplate.opsForValue().set("token", token);  //存储当前登录用户的id
            System.out.println(user.getId());
            //响应给前端，说当前用户已经登录
            return token;
        }
    }

    /**
     * 注册接口
     * @param users 注册人的用户信息
     * @return
     */
    @PostMapping("register")
    public String register(@RequestBody Users users) {
        //获取mybatisPlus 框架中的 LambdaQueryWrapper 类
        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        //构建查询语句 去数据库查询是否有这个  学号 的用户
        queryWrapper.eq(Users::getStudentNumber, users.getStudentNumber());
        // 然后使用mybatisplus自带的selectOne方法 传入我们的查询条件  查出用户
        Users user = userMapper.selectOne(queryWrapper);
        //如果存在，说明不能注册
        if (user != null) {
            return "0";
        } else {//如果不存在，说明能注册
            userMapper.insert(users);  //将当前注册信息插入数据库
            return "1";
        }
    }

    /**
     * 退出登录
     */
    @PostMapping("/logout")
    public void logout() {
        //删除登录缓存token
        stringRedisTemplate.delete("token");
    }

    /**
     * 重置密码
     * @param users  重置密码的用户信息
     * @return
     */
    @PostMapping("/resetPwd")
    public String resetPwd(@RequestBody Users users) {

        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Users::getStudentNumber, users.getStudentNumber());
        queryWrapper.eq(Users::getName, users.getName());
        //查询出该用户是否存在
        Users user = userMapper.selectOne(queryWrapper);
        //如果不存在，不能修改
        if (user == null) {
            return "0";
        }
        //如果存在
        UpdateWrapper<Users> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("student_number", users.getStudentNumber());
        updateWrapper.eq("name", users.getName());
        //修改数据库信息
        userMapper.update(users, updateWrapper);
        //响应前端
        return "1";
    }

    /**
     * 获取所有用户信息
     * @return
     */
    @GetMapping("all")
    public String allUser() {
        //查询条件是空，表示查询所有
        List<Users> users = userMapper.selectList(null);
        //因为不能展示给前端用户的密码，所以需要设置成null，然后在响应
        for (Users user : users) {
            user.setPassword(null);
        }
        return gson.toJson(users);
    }

    /**
     * 删除接口
     * @param users
     */
    @PostMapping("delete")
    public void deleteUser(@RequestBody Users users) {
        //删除用户信息
        userMapper.deleteById(users);
    }

    /**
     * 添加用户
     * @param users
     */
    @PostMapping("add")
    public void addUser(@RequestBody Users users) {
        //添加用户信息
        userMapper.insert(users);
    }

    /**
     * 更新用户
     * @param users
     */
    @PostMapping("update")
    public void updateUser(@RequestBody Users users) {
        //更新用户信息
        userMapper.updateById(users);
    }

    /**
     * 通过名字查询用户
     * @param user
     * @return
     */
    @PostMapping("searchName")
    public String searchName(@RequestBody Users user) {
        //如果传入的参数user参数 也就是名字传空，那么说明查询所有用户，直接调用上面写好的方法
        if (user.getName() == null || user.getName() == "") {
            return this.allUser();
        }
        //如果名字不为空， 那么根据构建条件语句进行查询
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", user.getName());
        List<Users> users = userMapper.selectList(queryWrapper);
        //密码设置为空
        for (Users user1 : users) {
            user1.setPassword(null);
        }
        //最后返回数据
        return gson.toJson(users);
    }
}
